Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / scripts / ci / setup-python.sh

Displaying Raw • Download


scripts/ci/setup-python.sh f193010f37dd3511a585dd3e5c9d56b22c60dde2 (f193010f) Text, 5.72 KB

T8b949e#!/bin/sh
T8b949e# Build and install Python from official python.org source.
T8b949e# Verifies: OpenPGP (.asc) when present, otherwise Sigstore (.sigstore) with cosign.
T8b949e# https://www.python.org/download/sigstore/ PEP 761 (3.14+): PGP removed; Sigstore only.
T8b949e#
T8b949e# Usage: setup-python.sh [version]
T8b949e# version: exact (3.14.x) or minor (3.14, resolved to latest patch).
Tffa657set -eu

. Ta5d6ff"Tff7b72$(dirname Ta5d6ff"Te6edf3$0Ta5d6ff"Tff7b72)Ta5d6ff/priv.shTa5d6ff"

T8b949e# Sigstore identity and OIDC issuer per release (see python.org/download/sigstore).
sigstore_identity_forTff7b72(Tff7b72) Tff7b72{
Te6edf3_vTff7b72=Ta5d6ff"Te6edf3$1Ta5d6ff"
Tff7b72case Ta5d6ff"Te6edf3$_vTa5d6ff" Tff7b72in
T79c0ff3.7.*Tff7b72) Tffa657echo Ta5d6ff"nad@python.org|https://github.com/login/oauth" Tb4b4b4;Tb4b4b4;
T79c0ff3.8.*Tb4b4b4|T79c0ff3.9.*Tff7b72) Tffa657echo Ta5d6ff"lukasz@langa.pl|https://github.com/login/oauth" Tb4b4b4;Tb4b4b4;
T79c0ff3.10.*Tb4b4b4|T79c0ff3.11.*Tff7b72) Tffa657echo Ta5d6ff"pablogsal@python.org|https://accounts.google.com" Tb4b4b4;Tb4b4b4;
T79c0ff3.12.*Tb4b4b4|T79c0ff3.13.*Tff7b72) Tffa657echo Ta5d6ff"thomas@python.org|https://accounts.google.com" Tb4b4b4;Tb4b4b4;
T79c0ff3.14.*Tb4b4b4|T79c0ff3.15.*Tff7b72) Tffa657echo Ta5d6ff"hugo@python.org|https://github.com/login/oauth" Tb4b4b4;Tb4b4b4;
T79c0ff3.16.*Tb4b4b4|T79c0ff3.17.*Tff7b72) Tffa657echo Ta5d6ff"savannah@python.org|https://github.com/login/oauth" Tb4b4b4;Tb4b4b4;
T79c0ff3.*.*Tff7b72) Tffa657echo Ta5d6ff"savannah@python.org|https://github.com/login/oauth" Tb4b4b4;Tb4b4b4;
*Tff7b72) Tffa657echo Ta5d6ff"" Tb4b4b4;Tb4b4b4;
Tff7b72esac
Tff7b72}

download_cosignTff7b72(Tff7b72) Tff7b72{
Te6edf3COSIGN_VERSIONTff7b72=Ta5d6ff"Tffd700${Te6edf3COSIGN_VERSIONTff7b72:-Te6edf32Tb4b4b4.4.1Tffd700}Ta5d6ff"
Te6edf3COSIGN_ARCHTff7b72=Ta5d6ff"linux-amd64"
Tff7b72case Ta5d6ff"Tff7b72$(uname -mTff7b72)Ta5d6ff" Tff7b72in
aarch64Tb4b4b4|arm64Tff7b72) Te6edf3COSIGN_ARCHTff7b72=Ta5d6ff"linux-arm64" Tb4b4b4;Tb4b4b4;
x86_64Tb4b4b4|amd64Tff7b72) Te6edf3COSIGN_ARCHTff7b72=Ta5d6ff"linux-amd64" Tb4b4b4;Tb4b4b4;
x86_64-gnuTff7b72) Te6edf3COSIGN_ARCHTff7b72=Ta5d6ff"linux-amd64" Tb4b4b4;Tb4b4b4;
*Tff7b72)
Tffa657echo Ta5d6ff"Ta5d6ffunsupported uname -m for cosign: Tff7b72$(uname -mTff7b72)Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tb4b4b4;Tb4b4b4;
Tff7b72esac
Te6edf3COSIGN_BINTff7b72=Ta5d6ff"Ta5d6ff/tmp/cosign-Tffd700${Te6edf3COSIGN_VERSIONTffd700}Ta5d6ff-Tffd700${Te6edf3COSIGN_ARCHTffd700}Ta5d6ff"
Tff7b72if Tff7b72[ ! -x Ta5d6ff"Te6edf3$COSIGN_BINTa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
curl -fsSL Ta5d6ff"Ta5d6ffhttps://github.com/sigstore/cosign/releases/download/vTffd700${Te6edf3COSIGN_VERSIONTffd700}Ta5d6ff/cosign-Tffd700${Te6edf3COSIGN_ARCHTffd700}Ta5d6ff" Tffea00\
-o Ta5d6ff"Te6edf3$COSIGN_BINTa5d6ff"
chmod +x Ta5d6ff"Te6edf3$COSIGN_BINTa5d6ff"
Tff7b72fi
Tffa657echo Ta5d6ff"Te6edf3$COSIGN_BINTa5d6ff"
Tff7b72}

Te6edf3PY_INPUTTff7b72=Ta5d6ff"Tffd700${Te6edf31Tff7b72:-Te6edf33Tb4b4b4.14Tffd700}Ta5d6ff"

Te6edf3CURRENTTff7b72=Ta5d6ff"Tff7b72$(python3 --version T79c0ff2>/dev/null Tb4b4b4| sed Ta5d6ff's/Python //'Tff7b72)Ta5d6ff" Tff7b72|| Tffa657true

Tff7b72case Ta5d6ff"Te6edf3$PY_INPUTTa5d6ff" Tff7b72in
*.*.*Tff7b72)
Te6edf3PY_VERSIONTff7b72=Ta5d6ff"Te6edf3$PY_INPUTTa5d6ff"
Tb4b4b4;Tb4b4b4;
*Tff7b72)
Tffa657echo Ta5d6ff"Ta5d6ffResolving latest Python Tffd700${Te6edf3PY_INPUTTffd700}Ta5d6ff.x from python.orgTa5d6ff"
Te6edf3PY_VERSIONTff7b72=Ta5d6ff"Tff7b72$(curl -fsSL Ta5d6ff"https://www.python.org/ftp/python/" Tffea00\
Tb4b4b4| grep -o Ta5d6ff"Ta5d6ffhref=\"Tffd700${Te6edf3PY_INPUTTffd700}Ta5d6ff\.[0-9]*/Ta5d6ff" Tffea00\
Tb4b4b4| sed Ta5d6ff's/href="//;s/\///' Tffea00\
Tb4b4b4| sort -t. -k3 -n Tffea00\
Tb4b4b4| tail -1Tff7b72)Ta5d6ff"
Tff7b72if Tff7b72[ -z Ta5d6ff"Te6edf3$PY_VERSIONTa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffFailed to resolve Python Tffd700${Te6edf3PY_INPUTTffd700}Ta5d6ff.xTa5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
Tffa657echo Ta5d6ff"Ta5d6ffResolved to Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff"
Tb4b4b4;Tb4b4b4;
Tff7b72esac

Tff7b72if Tff7b72[ Ta5d6ff"Te6edf3$CURRENTTa5d6ff" Tff7b72= Ta5d6ff"Te6edf3$PY_VERSIONTa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffPython Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff already installedTa5d6ff"
python3 --version
Tffa657exit T79c0ff0
Tff7b72fi

Tffa657echo Ta5d6ff"Ta5d6ffBuilding Python Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff from source (python.org)Ta5d6ff"

run_priv apt-get update -qq
run_priv apt-get install -y -qq Tffea00\
build-essential gnupg curl Tffea00\
libssl-dev zlib1g-dev libbz2-dev libreadline-dev Tffea00\
libsqlite3-dev libffi-dev liblzma-dev libncurses-dev > /dev/null T79c0ff2>Tb4b4b4&T79c0ff1

Te6edf3TARBALLTff7b72=Ta5d6ff"Ta5d6ffPython-Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff.tar.xzTa5d6ff"
Te6edf3SRC_URLTff7b72=Ta5d6ff"Ta5d6ffhttps://www.python.org/ftp/python/Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff"
Te6edf3SIG_URLTff7b72=Ta5d6ff"Tffd700${Te6edf3SRC_URLTffd700}Ta5d6ff.ascTa5d6ff"

curl -fsSL Ta5d6ff"Te6edf3$SRC_URLTa5d6ff" -o Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff"

Te6edf3SIG_HTTPTff7b72=Ta5d6ff"Tff7b72$(curl -sS -o Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.ascTa5d6ff" -w Ta5d6ff"%{http_code}" Ta5d6ff"Te6edf3$SIG_URLTa5d6ff" Tff7b72|| Tffa657trueTff7b72)Ta5d6ff"
Tff7b72if Tff7b72[ Ta5d6ff"Te6edf3$SIG_HTTPTa5d6ff" !Tff7b72= Ta5d6ff"200" Tff7b72]Tb4b4b4; Tff7b72then
rm -f Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.ascTa5d6ff"
Tff7b72fi

Te6edf3GPG_KEYSTff7b72=Ta5d6ff""
Tff7b72case Ta5d6ff"Te6edf3$PY_VERSIONTa5d6ff" Tff7b72in
T79c0ff3.13.*Tb4b4b4|T79c0ff3.14.*Tff7b72)
Te6edf3GPG_KEYSTff7b72=Ta5d6ff"A035C8C19219BA821ECEA86B64E628F8D684696D 7169605F62C751356D054A26A821E680E5FA6305"
Tb4b4b4;Tb4b4b4;
T79c0ff3.11.*Tb4b4b4|T79c0ff3.12.*Tff7b72)
Te6edf3GPG_KEYSTff7b72=Ta5d6ff"A035C8C19219BA821ECEA86B64E628F8D684696D 7169605F62C751356D054A26A821E680E5FA6305"
Tb4b4b4;Tb4b4b4;
T79c0ff3.9.*Tb4b4b4|T79c0ff3.10.*Tff7b72)
Te6edf3GPG_KEYSTff7b72=Ta5d6ff"E3FF2839C048B25C084DEBE9B26995E310250568"
Tb4b4b4;Tb4b4b4;
*Tff7b72)
Tffa657echo Ta5d6ff"Ta5d6ffNo known GPG key for Python Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff; skipping OpenPGP signature checkTa5d6ff" >Tb4b4b4&T79c0ff2
Tb4b4b4;Tb4b4b4;
Tff7b72esac

Te6edf3GPG_VERIFIEDTff7b72=T79c0ff0
Tff7b72if Tff7b72[ Ta5d6ff"Te6edf3$SIG_HTTPTa5d6ff" Tff7b72= Ta5d6ff"200" Tff7b72] Tff7b72&& Tff7b72[ -n Ta5d6ff"Te6edf3$GPG_KEYSTa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
Tffa657export Te6edf3GNUPGHOMETff7b72=Ta5d6ff"Tff7b72$(mktemp -dTff7b72)Ta5d6ff"
Tff7b72for key Tff7b72in Te6edf3$GPG_KEYSTb4b4b4; Tff7b72do
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys Ta5d6ff"Te6edf3$keyTa5d6ff" T79c0ff2>/dev/null Tff7b72|| Tffea00\
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys Ta5d6ff"Te6edf3$keyTa5d6ff" T79c0ff2>/dev/null Tff7b72|| Tffa657true
Tff7b72done
gpg --batch --verify Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.ascTa5d6ff" Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff"
rm -rf Ta5d6ff"Te6edf3$GNUPGHOMETa5d6ff"
Tffa657unset GNUPGHOME
Tffa657echo Ta5d6ff"OpenPGP signature verified"
Te6edf3GPG_VERIFIEDTff7b72=T79c0ff1
Tff7b72fi

Tff7b72if Tff7b72[ Ta5d6ff"Te6edf3$GPG_VERIFIEDTa5d6ff" !Tff7b72= Ta5d6ff"1" Tff7b72]Tb4b4b4; Tff7b72then
Te6edf3SIGSTORE_URLTff7b72=Ta5d6ff"Tffd700${Te6edf3SRC_URLTffd700}Ta5d6ff.sigstoreTa5d6ff"
Te6edf3SIGSTORE_HTTPTff7b72=Ta5d6ff"Tff7b72$(curl -sS -o Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.sigstoreTa5d6ff" -w Ta5d6ff"%{http_code}" Ta5d6ff"Te6edf3$SIGSTORE_URLTa5d6ff" Tff7b72|| Tffa657trueTff7b72)Ta5d6ff"
Tff7b72if Tff7b72[ Ta5d6ff"Te6edf3$SIGSTORE_HTTPTa5d6ff" !Tff7b72= Ta5d6ff"200" Tff7b72]Tb4b4b4; Tff7b72then
rm -f Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.sigstoreTa5d6ff"
Tffa657echo Ta5d6ff"Ta5d6ffNo OpenPGP signature (HTTP Tffd700${Te6edf3SIG_HTTPTffd700}Ta5d6ff) and no Sigstore bundle at Tffd700${Te6edf3SIGSTORE_URLTffd700}Ta5d6ff (HTTP Tffd700${Te6edf3SIGSTORE_HTTPTffd700}Ta5d6ff)Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
Te6edf3IITff7b72=Ta5d6ff"Tff7b72$(sigstore_identity_for Ta5d6ff"Te6edf3$PY_VERSIONTa5d6ff"Tff7b72)Ta5d6ff"
Tff7b72if Tff7b72[ -z Ta5d6ff"Te6edf3$IITa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
Tffa657echo Ta5d6ff"Ta5d6ffNo Sigstore identity mapping for Python Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff" >Tb4b4b4&T79c0ff2
Tffa657exit T79c0ff1
Tff7b72fi
Te6edf3SIG_IDENTITYTff7b72=Ta5d6ff"Tff7b72$(Tffa657echo Ta5d6ff"Te6edf3$IITa5d6ff" Tb4b4b4| cut -dTa5d6ff'|' -f1Tff7b72)Ta5d6ff"
Te6edf3SIG_ISSUERTff7b72=Ta5d6ff"Tff7b72$(Tffa657echo Ta5d6ff"Te6edf3$IITa5d6ff" Tb4b4b4| cut -dTa5d6ff'|' -f2Tff7b72)Ta5d6ff"
Te6edf3COSIGN_BINTff7b72=Ta5d6ff"Tff7b72$(download_cosignTff7b72)Ta5d6ff"
Ta5d6ff"Te6edf3$COSIGN_BINTa5d6ff" verify-blob --new-bundle-format Tffea00\
--certificate-oidc-issuer Ta5d6ff"Te6edf3$SIG_ISSUERTa5d6ff" Tffea00\
--certificate-identity Ta5d6ff"Te6edf3$SIG_IDENTITYTa5d6ff" Tffea00\
--bundle Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.sigstoreTa5d6ff" Tffea00\
Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff"
Tffa657echo Ta5d6ff"Sigstore signature verified"
Tff7b72fi

Tffa657cd /tmp
tar -xJf Ta5d6ff"Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff"
Tffa657cd Ta5d6ff"Ta5d6ffPython-Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff"

Te6edf3BUILD_LOGTff7b72=Ta5d6ff"/tmp/python-build.log"
./configure --prefixTff7b72=/usr/local --with-ensurepipTff7b72=install > Ta5d6ff"Te6edf3$BUILD_LOGTa5d6ff" T79c0ff2>Tb4b4b4&T79c0ff1
make -jTa5d6ff"Tff7b72$(nprocTff7b72)Ta5d6ff" >> Ta5d6ff"Te6edf3$BUILD_LOGTa5d6ff" T79c0ff2>Tb4b4b4&T79c0ff1
run_priv make install >> Ta5d6ff"Te6edf3$BUILD_LOGTa5d6ff" T79c0ff2>Tb4b4b4&T79c0ff1

run_priv ln -sf /usr/local/bin/python3 /usr/local/bin/python
run_priv ln -sf /usr/local/bin/pip3 /usr/local/bin/pip

Tffa657cd /
rm -rf Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff" Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.ascTa5d6ff" Ta5d6ff"Ta5d6ff/tmp/Tffd700${Te6edf3TARBALLTffd700}Ta5d6ff.sigstoreTa5d6ff" Ta5d6ff"Ta5d6ff/tmp/Python-Tffd700${Te6edf3PY_VERSIONTffd700}Ta5d6ff" Ta5d6ff"Te6edf3$BUILD_LOGTa5d6ff"

python3 --version
pip3 --version


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────